package zisu.netty.practice.netty.heartbeat;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleStateEvent;

/**
 * @Desc: ""
 * @Author: caixiang
 * @DATE: 2020/7/21 13:32
 */
public class MyServerHandler extends ChannelInboundHandlerAdapter {
    public int readIdleCount=0;
    public int writeIdleCount=0;
    public int readWriteIdleCount=0;
    /**
     *  @Description  
     *  @Param
     *      ctx  上下文
     *      evt  事件
     *  @Return  
     *  @Author caixiang
     *  @Date 2020/7/21  13:34 
     **/
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        //只要读 空闲 或者 写空闲了 ，，就会一直监听到事件 往下层handler 抛。。所以你处不处理 事件都会一直进来。
        if(evt instanceof IdleStateEvent){
            //将evt 向下转型 IdleStateEvent
            IdleStateEvent event = (IdleStateEvent)evt;
            String eventType = null;
            switch (event.state()){
                case READER_IDLE:
                    eventType = "读空闲";
                    readIdleCount++;
                    break;
                case WRITER_IDLE:
                    eventType = "写空闲";
                    writeIdleCount++;
                    break;
                case ALL_IDLE:
                    eventType = "读写空闲";
                    readWriteIdleCount++;
                    break;
            }
            System.out.println(ctx.channel().remoteAddress()+"===== 超时时间 ======"+ eventType);
            System.out.println("服务器做相应处理.......");
            if(readIdleCount == 5){
                //如果5次没有读 操作那么直接把连接断开。
                ctx.channel().close();
            }

            //当有其中任何一个空闲发生的时候 ，就把通道关闭，，那么 后面的空闲是接收不到的。
            //ctx.channel().close();
        }
    }
}
